import * as monaco from 'monaco-editor'

const options:
  | monaco.languages.IMonarchLanguage
  | monaco.Thenable<monaco.languages.IMonarchLanguage> = {
  // 为了插件尚未被 token 解析的内容，设置 defaultToken 为 invalid
  defaultToken: 'invalid',
  // 关键字定义
  keywords: [
    'abstract',
    'continue',
    'for',
    'new',
    'switch',
    'assert',
    'goto',
    'do',
    'if',
    'private',
    'this',
    'break',
    'protected',
    'throw',
    'else',
    'public',
    'enum',
    'return',
    'catch',
    'try',
    'interface',
    'static',
    'class',
    'finally',
    'const',
    'super',
    'while',
    'true',
    'false',
  ],
  // 类型定义
  typeKeywords: [
    'boolean',
    'double',
    'byte',
    'int',
    'short',
    'char',
    'void',
    'long',
    'float',
  ],
  // 操作符定义
  operators: [
    '=',
    '>',
    '<',
    '!',
    '~',
    '?',
    ':',
    '==',
    '<=',
    '>=',
    '!=',
    '&&',
    '||',
    '++',
    '--',
    '+',
    '-',
    '*',
    '/',
    '&',
    '|',
    '^',
    '%',
    '<<',
    '>>',
    '>>>',
    '+=',
    '-=',
    '*=',
    '/=',
    '&=',
    '|=',
    '^=',
    '%=',
    '<<=',
    '>>=',
    '>>>=',
  ],

  // 定义常见的正则表达式
  symbols: /[=><!~?:&|+\-*\/\^%]+/,

  // C# 样式字符串
  escapes:
    /\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,

  // 语言的主要 token 生成器
  tokenizer: {
    root: [
      // 标识符与关键字
      [
        /[a-z_$][\w$]*/,
        {
          cases: {
            '@typeKeywords': 'keyword',
            '@keywords': 'keyword',
            '@default': 'identifier',
          },
        },
      ],
      [/[A-Z][\w\$]*/, 'type.identifier'], // to show class names nicely

      // 空格
      { include: '@whitespace' },

      // 括号与运算符
      [/[{}()\[\]]/, '@brackets'],
      [/[<>](?!@symbols)/, '@brackets'],
      [/@symbols/, { cases: { '@operators': 'operator', '@default': '' } }],

      // @ 注释.
      // 作为示例，我们在这些 token 上发出调试日志消息
      [
        /@\s*[a-zA-Z_\$][\w\$]*/,
        { token: 'annotation', log: 'annotation token: $0' },
      ],

      // 各类数字定义
      [/\d*\.\d+([eE][\-+]?\d+)?/, 'number.float'],
      [/0[xX][0-9a-fA-F]+/, 'number.hex'],
      [/\d+/, 'number'],

      // 分隔符
      [/[;,.]/, 'delimiter'],

      // 字符串定义
      [/"([^"\\]|\\.)*$/, 'string.invalid'], // non-teminated string
      [/"/, { token: 'string.quote', bracket: '@open', next: '@string' }],
      [/'[^\\']'/, 'string'],
      [/(')(@escapes)(')/, ['string', 'string.escape', 'string']],
      [/'/, 'string.invalid'],
    ],
    // 自定义规则 - 备注
    comment: [
      [/[^\/*]+/, 'comment'],
      [/\/\*/, 'comment', '@push'], // nested comment
      ['\\*/', 'comment', '@pop'],
      [/[\/*]/, 'comment'],
    ],
    // 自定义规则 - 字符串
    string: [
      [/[^\\"]+/, 'string'],
      [/@escapes/, 'string.escape'],
      [/\\./, 'string.escape.invalid'],
      [/"/, { token: 'string.quote', bracket: '@close', next: '@pop' }],
    ],
    // 自定义规则 - 空格
    whitespace: [
      [/[ \t\r\n]+/, 'white'],
      [/\/\*/, 'comment', '@comment'],
      [/\/\/.*$/, 'comment'],
    ],
  },
}

export default options
